﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Ferreteria.Clases;

namespace Ferreteria.Forms.GenerarRemito
{
    public partial class EmitiRemito : Form
    {
        int pedidoid;
        DisancoEntities context;
        int autorizacionId;
        long numeroRemito;
        DataTable dtLineas;
        decimal subtotal;
        RemitoV RemitoImprimir;
        decimal iva;


        public EmitiRemito(int ped_id)
        {
            InitializeComponent();
            pedidoid = ped_id;

            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            
          
            var pedido = context.Pedido.FirstOrDefault(p => p.ped_id == ped_id);
            var cliente = pedido.Clientes;

            int nroLineas = pedido.LineaPedido.Count;
            bool autorizado = buscarAutorizacion("R");

            if (autorizado)
            {
                 txbFechaEmision.Text = pedido.ped_fecha.ToShortDateString();
                //Cargar datos del cliente
                txtbCliNombre.Text = pedido.Clientes.cliente_nombre;
                txtbCliLocalidad.Text = pedido.Clientes.cliente_localidad;
                txtbCliDireccion.Text = pedido.Clientes.cliente_direccion;
                txtbCliCondiva.Text = pedido.Clientes.CondicionIVA.condicion_sigla;
                txtbCliCuit.Text = pedido.Clientes.cliente_cuit;
                
                cargarLineasPedido();

                CalcularTotales();
            }
            else
            {
                MessageBox.Show("No se encontraron autorizaciones validas activas","Error !!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                btnEmitir.Enabled = false;
            }

            }

        private void CalcularTotales()
        {
            iva = Math.Round((subtotal * Constantes.IVA), 2);
        }

         private void cargarLineasPedido()
       {
        context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
        decimal preciounitfila;
        decimal preciototfila;
        dtLineas = new DataTable();
        dtLineas.Columns.Add("id");
        dtLineas.Columns.Add("Cantidad");
        dtLineas.Columns.Add("Codigo Art");
        dtLineas.Columns.Add("Articulo");
        dtLineas.Columns.Add("Precio Unitario");
        dtLineas.Columns.Add("Bonif");
        dtLineas.Columns.Add("Precio Bonif");
        dtLineas.Columns.Add("Precio Total");
        
        subtotal = 0;
        var pedido = context.Pedido.FirstOrDefault(p => p.ped_id == pedidoid);

        foreach (var linea in pedido.LineaPedido)
        {
            DataRow fila = dtLineas.NewRow();
            fila["id"] = linea.art_id;
            fila["Articulo"] = linea.Articulos.art_nombre;
            fila["Codigo Art"] = linea.Articulos.art_codigo;
            fila["Cantidad"] = linea.ped_cant;
            fila["Bonif"] = linea.ped_oferta_bonif;
            fila["Precio Unitario"] = "$ " + linea.ped_precio;
            fila["Precio Bonif"] = "$ " + Math.Round(Funcion.PrecioBonificado(linea.ped_precio, linea.ped_oferta_bonif), 2);
                    preciounitfila = Math.Round(Funcion.PrecioBonificado(linea.ped_precio, linea.ped_oferta_bonif),2);

            fila["Precio Total"] = "$ " + Math.Round((preciounitfila * linea.ped_cant),2);
                preciototfila = Math.Round((preciounitfila * linea.ped_cant),2);
          
            dtLineas.Rows.Add(fila);
            subtotal += Math.Round(preciototfila,2);
            }
            subtotal = Math.Round(subtotal, 2);
 
            dgvListaArt.DataSource = dtLineas;
            dgvListaArt.Columns["id"].Visible = false;
            dgvListaArt.Columns["Articulo"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dgvListaArt.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dgvListaArt.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
         }

    
        private bool buscarAutorizacion(string tipo)
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            foreach (var auth in context.Autorizaciones)
            {
                if (auth.autorizacion_tipo_comp == tipo && auth.autorizacion_estado && auth.autorizacion_limite_fecha.Date > DateTime.Now.Date)
                {
                    autorizacionId = auth.autorizacion_id;
                    numeroRemito = auth.autorizacion_ultimo_numero + 1;

                    if (numeroRemito > auth.autorizacion_limite_max)
                    {
                        MessageBox.Show("No quedan Numeros de Remitos disponibles", "Operación Exitosa!!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return false;
                    }
                    else
                    {
                        txbRemitoNumero.Text = numeroRemito.ToString("0000-00000000");
                        return true;
                    }
                }
            }
            return false;
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnEmitir_Click(object sender, EventArgs e)
        {
             context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
             var pedido = context.Pedido.FirstOrDefault(p => p.ped_id == pedidoid);

                bool valido = true;
                string lista = "Stock insuficiente para los siguientes articulos:\n";

                //Verificar existencia de stock
                foreach (var linea in pedido.LineaPedido)
                {
                    if (linea.ped_cant > linea.Articulos.art_stock)
                    {
                        valido = false;
                        lista += linea.Articulos.art_nombre + " (" + linea.Articulos.art_stock.ToString() + ")\n";
                    }
                }

                if (valido)
                {
                    //Actualizar stock de cada articulo
                    foreach (var linea in pedido.LineaPedido)
                    {
                        linea.Articulos.art_stock -= linea.ped_cant;
                    }

                    //Registrar ultimo numero de factura usado
                    //var auth = context.Autorizaciones.FirstOrDefault(a => a.autorizacion_id == autorizacionId);
                   //auth.autorizacion_ultimo_numero = numeroFactura;

                
                    //Registrar la nueva factura pendiente de impresion
                    Ventas nuevaVenta = new Ventas();
                    nuevaVenta.cliente_id = pedido.cliente_id;
                    nuevaVenta.venta_fecha = DateTime.Now;
                    nuevaVenta.venta_estado = Estado.Pendiente;
                    nuevaVenta.venta_tipo_comprobante = "?" ;
                    nuevaVenta.venta_nro_inicio = 0;
                    nuevaVenta.venta_nro_fin = 0;
                    nuevaVenta.venta_subtotal = subtotal;
                    nuevaVenta.venta_descuento = 0;
                    //nuevaVenta.venta_iva = iva;
                    nuevaVenta.venta_iva = 0;
                    // falta registrar el iva
                    //if ((string)cmbTipo.SelectedItem == "B")
                    //    nuevaVenta.venta_iva = 0;
                    //else
                    //    nuevaVenta.venta_iva = 0;
                       

                    foreach (DataRow lineaPedido in dtLineas.Rows)
                    {
                        LineaVenta nuevaLineaVenta = new LineaVenta();
                        nuevaLineaVenta.art_id = Convert.ToInt32(lineaPedido["id"]);
                        nuevaLineaVenta.cantidad_venta = Convert.ToInt32(lineaPedido["Cantidad"]);
                        string preciounit = lineaPedido["Precio Unitario"].ToString().Replace("$", "");
                        nuevaLineaVenta.precio_venta = Convert.ToDecimal(preciounit);
                        string bonif = lineaPedido["Bonif"].ToString().Replace("%", "");
                        nuevaLineaVenta.oferta_bonif = Convert.ToDecimal(bonif);
                        string preciobonif = lineaPedido["Precio Bonif"].ToString().Replace("$", "");
                        nuevaLineaVenta.precio_bonif = Convert.ToDecimal(preciobonif);
                        nuevaVenta.LineaVenta.Add(nuevaLineaVenta);
                    }

                    //Registro una nueva cuenta para esta factura
                    Cuentas nuevaCuenta = new Cuentas();
                    nuevaCuenta.cuenta_fecha = DateTime.Now;

                    // falta registrar el monto de la cuenta

                    //if ((string)cmbTipo.SelectedItem == "B")
                    //    nuevaCuenta.cuenta_monto = subtotal_descontado;
                    //else
                    //    nuevaCuenta.cuenta_monto = subtotal_descontado + iva;
                   
                    //nuevaCuenta.cuenta_monto = subtotal + iva;
                    nuevaCuenta.cuenta_monto = subtotal;
                    nuevaCuenta.cuenta_pagado = 0;
                    nuevaCuenta.cliente_id = pedido.cliente_id;
                    nuevaCuenta.cuenta_estado = Estado.Emitida;
                    nuevaVenta.Cuentas = nuevaCuenta;

                    pedido.ped_estado = Estado.Emitida;

                    context.Ventas.AddObject(nuevaVenta);

                    Pedido pedaeliminar = context.Pedido.FirstOrDefault(p => p.ped_id == pedidoid);
                    context.Pedido.DeleteObject(pedaeliminar);

                    //Nuevo Remito
               
                    RemitoV RemitoNuevo = new RemitoV();

                    RemitoNuevo.id_venta = nuevaVenta.id_venta;
                    RemitoNuevo.remito_fecha = DateTime.Now;
                    RemitoNuevo.remito_nro_inicio = numeroRemito;
                    RemitoNuevo.remito_nro_fin = numeroRemito;
                    RemitoNuevo.remito_estado = Clases.Estado.Emitida;

                     foreach (DataRow lineaPedido in dtLineas.Rows)
                    {
                        RemitoLinea NuevaLineaRemito = new RemitoLinea();
                       
                        NuevaLineaRemito.art_id = Convert.ToInt32(lineaPedido["id"]);
                        NuevaLineaRemito.remlinea_cantidad = Convert.ToInt32(lineaPedido["Cantidad"]);
                        RemitoNuevo.RemitoLinea.Add(NuevaLineaRemito);
                    }
                   
                    Autorizaciones Autoriz = context.Autorizaciones.FirstOrDefault(a => a.autorizacion_id.Equals(autorizacionId));
                    Autoriz.autorizacion_ultimo_numero = numeroRemito; //???

                    context.RemitoV.AddObject(RemitoNuevo);
                    RemitoImprimir = RemitoNuevo;
                    context.SaveChanges();

                    MessageBox.Show("Remito Generado Correctamente", "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    this.Close();
                    imprimir();
        }
    }

        private void imprimir()
        {
            printDialog.PrinterSettings.Copies = 3; 
         
            DialogResult resultadounico = printDialog.ShowDialog();
            if (resultadounico == DialogResult.OK)
            {
                
                pdRemitoUnico.PrinterSettings = printDialog.PrinterSettings;
              
                printPrevDRemito.Document = pdRemitoUnico;
                ((Form)printPrevDRemito).WindowState = FormWindowState.Maximized;
                printPrevDRemito.ShowDialog();
            }
        }

        private Font printFont = new Font("Calibri", 9);
        private Font miniprintFont = new Font("Calibri", 8);
        private Font printFontTNormal10 = new Font("Calibri", 10);
        private Font printFontTit = new Font("Calibri", 11);


        private void pdRemitoUnico_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
             context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            StringFormat formato = new StringFormat();
            formato.Alignment = StringAlignment.Center;

            string remitonro = numeroRemito.ToString();
                  
                string fecha = RemitoImprimir.remito_fecha.Date.ToString("dd/MM/yyyy");
               
                e.Graphics.DrawString(remitonro.Substring(1, 8), miniprintFont, Brushes.Black, 585, 63);
                //e.Graphics.DrawLine(Pens.Black, 580, 52, 583, 52);
                e.Graphics.DrawString("Fecha:", printFontTNormal10, Brushes.Black, 500, 75);
                e.Graphics.DrawString(fecha, printFontTNormal10, Brushes.Black, 570, 75);

                e.Graphics.DrawString(RemitoImprimir.Ventas.Clientes.cliente_nombre, printFontTNormal10, Brushes.Black, 130, 186);
                e.Graphics.DrawString(RemitoImprimir.Ventas.Clientes.cliente_direccion, printFontTNormal10, Brushes.Black, 130, 201);
                e.Graphics.DrawString(RemitoImprimir.Ventas.Clientes.cliente_localidad, printFontTNormal10, Brushes.Black, 550, 201);
                e.Graphics.DrawString(RemitoImprimir.Ventas.Clientes.CondicionIVA.condicion_sigla, printFontTNormal10, Brushes.Black, 130, 216);
                e.Graphics.DrawString(RemitoImprimir.Ventas.Clientes.cliente_cuit, printFontTNormal10, Brushes.Black, 550, 216);

                e.Graphics.DrawString("Cliente:", printFontTNormal10, Brushes.Black, 90, 186, formato);
                e.Graphics.DrawString("Dirección:", printFontTNormal10, Brushes.Black, 80, 201, formato);
                e.Graphics.DrawString("Localidad:", printFontTNormal10, Brushes.Black, 500, 201, formato);
                e.Graphics.DrawString("Cond. IVA:", printFontTNormal10, Brushes.Black, 80, 216, formato);
                e.Graphics.DrawString("CUIT:", printFontTNormal10, Brushes.Black, 515, 216, formato);
            
            //e.Graphics.DrawString("Factura:", printFont, Brushes.Black, 80, 250, formato);
            //string comp = lblNVOcomptipo.Text + " " + lblNVOCompNro.Text.ToString();
            //e.Graphics.DrawString(comp, printFont, Brushes.Black, 180, 250, formato);

            int Yencabezado = 275;

            String Cant = "Cantidad";
            e.Graphics.DrawString(Cant, printFontTNormal10, Brushes.Black, 47, Yencabezado);
            String Cod = "Codigo Art";
            e.Graphics.DrawString(Cod, printFontTNormal10, Brushes.Black, 132, Yencabezado);
            String Art = "Articulo";
            e.Graphics.DrawString(Art, printFontTNormal10, Brushes.Black, 368, Yencabezado);

            int posY = Yencabezado + 20;
            int anchoLinea = 20;
            int posCantidad = 50 + 15;
            int posCod = posCantidad + 72;
            int posArticulo = posCod + 100;

            foreach (DataRow fila in dtLineas.Rows)
            {
                e.Graphics.DrawString(fila["Cantidad"].ToString(), printFontTNormal10, Brushes.Black, posCantidad, posY);
                e.Graphics.DrawString(fila["Codigo Art"].ToString(), printFontTNormal10, Brushes.Black, posCod, posY);
                e.Graphics.DrawString(fila["Articulo"].ToString(), printFontTNormal10, Brushes.Black, posArticulo, posY);
                posY += anchoLinea;
            }
         
        int lineafin = 995;
        int posSubtotX = 65;

        String firma = "Recibí Conforme:.........................";
        e.Graphics.DrawString(firma, printFontTit, Brushes.Black, posSubtotX, lineafin);

        String aclaracion = "Aclaración:...........................................";
        e.Graphics.DrawString(aclaracion, printFontTit, Brushes.Black, posSubtotX + 450, lineafin);
        }
}}